/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package matematicadiscretaxml;

import arbol_prueba.BTree;
import java.util.ArrayList;

/**
 *
 * @author diego
 */
public class OperacionesArchivoXML {

    public OperacionesArchivoXML(){}

   
    public String buscarTablaDeCampo(BTree nodo, String nombre_campo)
    {
        String nombre_tabla = "";

        if( nodo.getIzquierda()!= null )
        {
            nombre_tabla = nombre_tabla + buscarTablaDeCampo(nodo.getIzquierda(), nombre_campo);
        }
        if(nodo.getDerecha() != null)
        {
            nombre_tabla = nombre_tabla + buscarTablaDeCampo(nodo.getDerecha(), nombre_campo);
        }

        if( ((Lexema)nodo.getElement()).getTipo_lexema() == 4 )
        {
            Archivo carchivo = new Archivo();
            carchivo.LeerArchivo("archivos_usados/archivos_base_datos/archivos_definicion/"+
                    ((Lexema)nodo.getElement()).getLexema().toLowerCase()+"_def.xml");

            if( !carchivo.getContenido_archivo().isEmpty() )
            {
                XML xml_ = new XML("archivos_usados/archivos_base_datos/archivos_definicion/"+
                    ((Lexema)nodo.getElement()).getLexema().toLowerCase()+"_def.xml");
                ArrayList arreglo = xml_.leerXMLArchivos("campo", "nombre");

                for (int i = 0; i < arreglo.size(); i++ )
                {
                    if(arreglo.get(i).toString().toLowerCase().equals(nombre_campo.toLowerCase()))
                    {
                        nombre_tabla = ((Lexema)nodo.getElement()).getLexema().toLowerCase();
                    }
                }
            }
            else
            {
                System.out.println("EL ARCHIVO "+((Lexema)nodo.getElement()).getLexema().toLowerCase()+"_def NO EXISTE");
            }
        }
        return nombre_tabla;
    }

    public int buscarCamposEnArbol(BTree nodo, String nombre_campo)
    {
        int num_repitencias_campo = 0;

        if( nodo.getIzquierda()!= null )
        {
            num_repitencias_campo = num_repitencias_campo + buscarCamposEnArbol(nodo.getIzquierda(), nombre_campo);
        }
        if(nodo.getDerecha() != null)
        {
            num_repitencias_campo = num_repitencias_campo + buscarCamposEnArbol(nodo.getDerecha(), nombre_campo);
        }

        if( ((Lexema)nodo.getElement()).getTipo_lexema() == 4 )
        {
            Archivo carchivo = new Archivo();
            carchivo.LeerArchivo("archivos_usados/archivos_base_datos/archivos_definicion/"+
                    ((Lexema)nodo.getElement()).getLexema().toLowerCase()+"_def.xml");

            if( !carchivo.getContenido_archivo().isEmpty() )
            {
                XML xml_ = new XML("archivos_usados/archivos_base_datos/archivos_definicion/"+
                    ((Lexema)nodo.getElement()).getLexema().toLowerCase()+"_def.xml");
                ArrayList arreglo = xml_.leerXMLArchivos("campo", "nombre");

                for (int i = 0; i < arreglo.size(); i++ )
                {
                    if(arreglo.get(i).toString().toLowerCase().equals(nombre_campo.toLowerCase()))
                    {
                        num_repitencias_campo = num_repitencias_campo + 1;
                    }
                }
            }
            else
            {
                System.out.println("EL ARCHIVO "+((Lexema)nodo.getElement()).getLexema().toLowerCase()+"_def NO EXISTE");
            }
        }
        return num_repitencias_campo;
    }


    public int buscarCamposEnArbol(BTree nodo, String nombre_campo, String nombre_tabla)
    {
        int num_repitencias_campo = 0;

        if( nodo.getIzquierda()!= null )
        {
            num_repitencias_campo = num_repitencias_campo + buscarCamposEnArbol(nodo.getIzquierda(), nombre_campo, nombre_tabla);
        }
        if(nodo.getDerecha() != null)
        {
            num_repitencias_campo = num_repitencias_campo + buscarCamposEnArbol(nodo.getDerecha(), nombre_campo, nombre_tabla);
        }

        if( ((Lexema)nodo.getElement()).getTipo_lexema() == 4
                && ((Lexema)nodo.getElement()).getLexema().toLowerCase().equals(nombre_tabla.toLowerCase()))
        {
            Archivo carchivo = new Archivo();
            carchivo.LeerArchivo("archivos_usados/archivos_base_datos/archivos_definicion/"+
                    ((Lexema)nodo.getElement()).getLexema().toLowerCase()+"_def.xml");

            if( !carchivo.getContenido_archivo().isEmpty() )
            {
                XML xml_ = new XML("archivos_usados/archivos_base_datos/archivos_definicion/"+
                    ((Lexema)nodo.getElement()).getLexema().toLowerCase()+"_def.xml");
                ArrayList arreglo = xml_.leerXMLArchivos("campo", "nombre");

                for (int i = 0; i < arreglo.size(); i++ )
                {
                    if(arreglo.get(i).toString().toLowerCase().equals(nombre_campo.toLowerCase()))
                    {
                        num_repitencias_campo = num_repitencias_campo + 1;
                    }
                }
            }
            else
            {
                System.out.println("EL ARCHIVO "+((Lexema)nodo.getElement()).getLexema().toLowerCase()+"_def NO EXISTE");
            }
        }
        return num_repitencias_campo;
    }

    public String buscarTipoDatoDeCampo(BTree nodo, String nombre_campo, String nombre_tabla)
    {
        String tipo_dato_campo = "";

        if( nodo.getIzquierda()!= null )
        {
            tipo_dato_campo = tipo_dato_campo + buscarTipoDatoDeCampo(nodo.getIzquierda(), nombre_campo, nombre_tabla);
        }
        if(nodo.getDerecha() != null)
        {
            tipo_dato_campo = tipo_dato_campo + buscarTipoDatoDeCampo(nodo.getDerecha(), nombre_campo, nombre_tabla);
        }

        if( ((Lexema)nodo.getElement()).getTipo_lexema() == 4 && ((Lexema)nodo.getElement()).getLexema().toLowerCase().equals(nombre_tabla.toLowerCase()) )
        {
            Archivo carchivo = new Archivo();
            carchivo.LeerArchivo("archivos_usados/archivos_base_datos/archivos_definicion/"+
                    ((Lexema)nodo.getElement()).getLexema().toLowerCase()+"_def.xml");

            if( !carchivo.getContenido_archivo().isEmpty() )
            {
                XML xml_ = new XML("archivos_usados/archivos_base_datos/archivos_definicion/"+
                    ((Lexema)nodo.getElement()).getLexema().toLowerCase()+"_def.xml");
                ArrayList arreglo = xml_.leerXMLArchivosCondicion("campo", "nombre",nombre_campo.toLowerCase());

                if(arreglo.size() == 1)
                {
                    tipo_dato_campo = arreglo.get(0).toString();
                }
            }
            else
            {
                System.out.println("EL ARCHIVO "+((Lexema)nodo.getElement()).getLexema().toLowerCase()+"_def NO EXISTE");
            }
        }
        return tipo_dato_campo;
    }
    
    
    public ArrayList verificarIntegridadReferencial(  ObjetoQuery[][] tabla_obj_query
                                                ,ArrayList<ObjetoQuery> lista_valores_actualizar)
    {
        ArrayList lista_tablas = new ArrayList();
        ArrayList<DefinicionTabla> lista_columnas_aux = new ArrayList();
        ObjetoQuery[][] tabla_obj_query_aux = new ObjetoQuery[0][0];
        ArrayList lista_errores_actualizacion = new ArrayList<Error>();
        
        XML obj_xml = new XML("archivos_usados/analisis_lexico/diccionario/tablas.xml");
        
        lista_tablas = obj_xml.leerXMLArchivos("tabla", "nombre");

        for(int i = 0; i<lista_tablas.size(); i++)
        {
            if( !lista_valores_actualizar.get(0).getTabla().toLowerCase().equals(lista_tablas.get(i).toString().toLowerCase()) )
            {
                System.out.println("TABLA: "+lista_tablas.get(i).toString());

                Archivo carchivo = new Archivo();
                carchivo.LeerArchivo("archivos_usados/archivos_base_datos/archivos_definicion/"+
                                        lista_tablas.get(i).toString()+"_def.xml");

                if( !carchivo.getContenido_archivo().isEmpty() )
                {

                    obj_xml = new XML("archivos_usados/archivos_base_datos/archivos_definicion/"+
                                            lista_tablas.get(i).toString()+"_def.xml");

                    lista_columnas_aux = obj_xml.retornarListaCampos(lista_tablas.get(i).toString());

                    for(int j = 0; j<lista_columnas_aux.size(); j++)
                    {
                        if(lista_columnas_aux.get(j).getForanea().equals("si"))
                        {
                            if( lista_columnas_aux.get(j).getTabla_referencia().toLowerCase().equals(lista_valores_actualizar.get(0).getTabla().toLowerCase()) )
                            {
                                obj_xml = new XML("archivos_usados/archivos_base_datos/archivos_datos/"+
                                                lista_tablas.get(i).toString()+"_dat.xml");
                                tabla_obj_query_aux = obj_xml.leerArchivosDatos(lista_tablas.get(i).toString());

                                for(int m = 0; m<tabla_obj_query_aux.length; m++)
                                {
                                    for(int n = 0; n<tabla_obj_query_aux[0].length; n++)
                                    {
                                        if(tabla_obj_query_aux[m][n].getColumna().toLowerCase().equals(lista_columnas_aux.get(j).getNombre().toLowerCase()))
                                        {
                                            for(int p = 0; p<tabla_obj_query.length; p++)
                                            {
                                                for(int q = 0; q<tabla_obj_query[0].length; q++)
                                                {
                                                    if(tabla_obj_query[p][q].getColumna().toLowerCase().equals(lista_columnas_aux.get(j).getNombre().toLowerCase()))
                                                    {
                                                        if(tabla_obj_query[p][q].getObjeto().toString().equals(tabla_obj_query_aux[m][n].getObjeto().toString()))
                                                        {
                                                            lista_errores_actualizacion.add(new Error("INTEGRIDAD REFERENCIAL", "NO SE PUEDE MODIFICAR LA CLAVE PRIMARIA, ESTA EXISTE COMO FORANEA EN OTRA TABLA"));
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

//                    imprimirMatriz(tabla_obj_query_aux);
                }
                else
                {
                    lista_errores_actualizacion.add(new Error("BLOQUE UPDATE", "LA TABLA NO EXISTE"));
                }
            }
            else
            {
                Archivo carchivo = new Archivo();
                carchivo.LeerArchivo("archivos_usados/archivos_base_datos/archivos_definicion/"+
                                        lista_tablas.get(i).toString()+"_def.xml");

                if( !carchivo.getContenido_archivo().isEmpty() )
                {

                    obj_xml = new XML("archivos_usados/archivos_base_datos/archivos_definicion/"+
                                            lista_tablas.get(i).toString()+"_def.xml");

                    lista_columnas_aux = obj_xml.retornarListaCampos(lista_tablas.get(i).toString());

                    for(int j = 0; j<lista_columnas_aux.size(); j++)
                    {
                        if(lista_columnas_aux.get(j).getPrimaria().equals("si"))
                        {
                            if( lista_columnas_aux.get(j).getNombre_tabla().toLowerCase().equals(lista_valores_actualizar.get(0).getTabla().toLowerCase()) )
                            {
                                obj_xml = new XML("archivos_usados/archivos_base_datos/archivos_datos/"+
                                                lista_tablas.get(i).toString()+"_dat.xml");
                                tabla_obj_query_aux = obj_xml.leerArchivosDatos(lista_tablas.get(i).toString());

                                for(int m = 0; m<tabla_obj_query_aux.length; m++)
                                {
                                    for(int n = 0; n<tabla_obj_query_aux[0].length; n++)
                                    {
                                        if(tabla_obj_query_aux[m][n].getColumna().toLowerCase().equals(lista_columnas_aux.get(j).getNombre().toLowerCase()))
                                        {
                                            for(int k = 0; k<lista_valores_actualizar.size(); k++)
                                            {
                                                if( tabla_obj_query_aux[m][n].getColumna().toLowerCase().equals(lista_valores_actualizar.get(k).getColumna().toLowerCase()) )
                                                {
                                                    if(lista_valores_actualizar.get(k).getObjeto().toString().toLowerCase().equals(tabla_obj_query_aux[m][n].getObjeto().toString().toLowerCase()) )
                                                    {
                                                        lista_errores_actualizacion.add(new Error("INTEGRIDAD REFERENCIAL", "LA CLAVE PRIMARIA A MODIFICAR YA EXISTE EN LA TABLA"));
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    lista_errores_actualizacion.add(new Error("BLOQUE UPDATE", "LA TABLA NO EXISTE"));
                }
                
            }
            
        }
        return lista_errores_actualizacion;
    }

    public ArrayList verificarIntegridadReferencial( ObjetoQuery[][] tabla_obj_query)
    {
        ArrayList lista_tablas = new ArrayList();
        ArrayList<DefinicionTabla> lista_columnas_aux = new ArrayList();
        ObjetoQuery[][] tabla_obj_query_aux = new ObjetoQuery[0][0];
        ArrayList lista_errores_actualizacion = new ArrayList<Error>();

        XML obj_xml = new XML("archivos_usados/analisis_lexico/diccionario/tablas.xml");

        lista_tablas = obj_xml.leerXMLArchivos("tabla", "nombre");

        if(tabla_obj_query.length != 0)
        {
            for(int i = 0; i<lista_tablas.size(); i++)
            {
                if( !tabla_obj_query[0][0].getTabla().toLowerCase().equals(lista_tablas.get(i).toString().toLowerCase()) )
                {
                    System.out.println("TABLA: "+lista_tablas.get(i).toString());

                    Archivo carchivo = new Archivo();
                    carchivo.LeerArchivo("archivos_usados/archivos_base_datos/archivos_definicion/"+
                                            lista_tablas.get(i).toString()+"_def.xml");

                    if( !carchivo.getContenido_archivo().isEmpty() )
                    {

                        obj_xml = new XML("archivos_usados/archivos_base_datos/archivos_definicion/"+
                                                lista_tablas.get(i).toString()+"_def.xml");

                        lista_columnas_aux = obj_xml.retornarListaCampos(lista_tablas.get(i).toString());

                        for(int j = 0; j<lista_columnas_aux.size(); j++)
                        {
                            if(lista_columnas_aux.get(j).getForanea().equals("si"))
                            {
                                if( lista_columnas_aux.get(j).getTabla_referencia().toLowerCase().equals(tabla_obj_query[0][0].getTabla().toLowerCase()) )
                                {
                                    obj_xml = new XML("archivos_usados/archivos_base_datos/archivos_datos/"+
                                                    lista_tablas.get(i).toString()+"_dat.xml");
                                    tabla_obj_query_aux = obj_xml.leerArchivosDatos(lista_tablas.get(i).toString());

                                    for(int m = 0; m<tabla_obj_query_aux.length; m++)
                                    {
                                        for(int n = 0; n<tabla_obj_query_aux[0].length; n++)
                                        {
                                            if(tabla_obj_query_aux[m][n].getColumna().toLowerCase().equals(lista_columnas_aux.get(j).getNombre().toLowerCase()))
                                            {
                                                for(int p = 0; p<tabla_obj_query.length; p++)
                                                {
                                                    for(int q = 0; q<tabla_obj_query[0].length; q++)
                                                    {
                                                        if(tabla_obj_query[p][q].getColumna().toLowerCase().equals(lista_columnas_aux.get(j).getNombre().toLowerCase()))
                                                        {
                                                            if(tabla_obj_query[p][q].getObjeto().toString().equals(tabla_obj_query_aux[m][n].getObjeto().toString()))
                                                            {
                                                                lista_errores_actualizacion.add(new Error("INTEGRIDAD REFERENCIAL", "NO SE PUEDE MODIFICAR LA CLAVE PRIMARIA, ESTA EXISTE COMO FORANEA EN OTRA TABLA"));
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        lista_errores_actualizacion.add(new Error("BLOQUE UPDATE", "LA TABLA NO EXISTE"));
                    }
                }
            }
        }
        
        return lista_errores_actualizacion;
    }

}
